/// @brief 定义函数类型 释放节点中的元素的内存
typedef void FreeEleFunc(void *);

/// @brief 定义函数类型 打印节点中的元素
typedef void PrintEleFunc(void *);

/// @brief 定义函数类型返回元素id
typedef int GetEleIdFunc(void *);

/// @brief 链表节点
typedef struct node {
  void *ele;         // 元素指针
  struct node *next; // 后一个节点
  struct node *pre;  // 前一个节点
} Node;

/// @brief 链表
typedef struct link_list {
  int size;                   // 链表大小
  Node *head;                 // 头节点
  Node *tail;                 // 尾节点
  FreeEleFunc *freeEleFunc;   // 释放节点元素的内存的函数
  PrintEleFunc *printEleFunc; // 打印节点元素的内存的函数
} LinkList;

/// @brief 新建链表
///@param freeEleFunc 释放元素内存函数
///@param printEleFunc 打印元素函数
/// @return
LinkList *newLinkList(FreeEleFunc *freeEleFunc, PrintEleFunc *printEleFunc);

/// @brief 打印链表中的元素
/// @param link_list
void printLinkList(LinkList *link_list);

/// @brief 清空链表
/// @param link_list
void clearLinkList(LinkList *link_list);

/// @brief 添加元素
/// @param link_list
/// @param ele
void insertLinkListEle(LinkList *link_list, void *ele);

/// @brief 删除节点
/// @param link_list 
/// @param id 
/// @param getEleIdFunc 获取元素id的函数
void deleteLinkListNode(LinkList *link_list, int id, GetEleIdFunc * getEleIdFunc);

/// @brief 释放节点空间
/// @param link_list 
/// @param node 
void linkListFreeNode(LinkList *link_list,Node * node);

/// @brief 释放链表空间
/// @param link_list
void freeLinkList(LinkList *link_list);